<?php
/**
 * DIRECTORY_SEPARATOR 的简写
 */
define('DS', DIRECTORY_SEPARATOR);

/**
 * Real Fast的目录
 *
 */
define('RF_DIR', dirname(__FILE__));

/**
 * CURRENT_TIMESTAMP 定义为当前时间，减少框架调用 time() 的次数
 */
define('CURRENT_TIMESTAMP', time());




/**
 * Real Fast 基类
 *
 */
class rf
{
    /**
     * 框架的配置存放的地方
     */
    static $config        = array();

    /**
     * 单子的存放单元
     */
    static $singletonObjs = array();
    
    /**
     * 取得控制器名称
     *
     * @param string $controller_name
     * @return string
     */
    static function controllerClassName($controller_name, $suffix = 'Controller')
    {
    	return $controller_name . $suffix;
    }

    /**
     * 取得方法名称
     *
     * @param string $action
     * @return string
     */
    static function actionName($action, $suffix = 'Action')
    {
    	return $action . $suffix;
    }

    /**
     * 使用控制器和方法，多用于控制器的内部转发初始时的调度
     *
     * @param string $controller 
     * @param string $action
     * @param string $path
     */
    static function useControllerAction($controller, $action, $path = PRODUCT_PATH)
    {
        $controller      = strtolower($controller);
        $action          = strtolower($action);
        // 控制器类名称
        $controllerClass = self::controllerClassName($controller);
        // 方法名称
        $actionName      = self::actionName($action);
        $file = $path . DS . 'controller' . DS . $controller . '.php';
        if (!is_file($file))
        {
            throw new rf_exception_misscontroller();
        }
        require($file);
        $runController = new $controllerClass();
        $runController->$actionName();
    }

    /**
     * 取得类的唯一实例
     *
     * @param string $class_name 类名
     */
    static function singleton($class_name)
    {
    	if (in_array($class_name,array_keys(self::$singletonObjs)))
    	{
    		return self::$singletonObjs[$class_name];
    	}
    	else
    	{
    		return self::regist(new $class_name(),$class_name);
    	}
    }
    
    /**
     * 注册一个类到单子存储单元
     *
     * @param object $object
     * @param string $class_name
     * @return object
     */
    static function regist($object, $class_name)
    {
    	self::$singletonObjs[$class_name] = $object;
    	return $object;
    }

    /**
     * 载入一个类
     *
     * @param string $class_name
     * @return string
     */
    static function loadClass($class_name)
    {
        if (class_exists($class_name, false) || interface_exists($class_name, false))
        {
            return $class_name;
        }
        $class_name = strtolower($class_name);
        // 文件路径名
        $filePathName = str_replace('_', DS, $class_name);
        require_once(_ROOT_ . DS . $filePathName . '.php');
        if (!class_exists($class_name))
        {
            exit($filename . ' not include the class - ' . $class_name);
        }
        return $class_name;
    }

    /**
     * 自动载入类
     *
     * @param string $class_name
     */
    static function autoload($class_name)
    {
    	self::loadClass($class_name);
    }
    
    
    /**
     * 格式化输出
     *
     * @param mixed $rowset
     * @return void
     */
    static function dump($rowset)
    {
        echo '<pre>';
        print_r($rowset);
        echo '</pre>';
    }

    /**
     * 
     * @todo 入口执行文件
     */
    static function run()
    {
        if (!isset($_GET['c']))
        {
            $_GET['c'] = 'default';
        }
        if (!isset($_GET['a']))
        {
            $_GET['a'] = 'index';
        }
        self::useControllerAction($_GET['c'], $_GET['a']); 
    }

    /**
     * 添加或覆盖配置
     */
    static function setIni($option, $data = null)
    {
        if (is_array($option))
        {
            if (isset($data))
            {
                foreach ($option as $value)
                {
                    self::setIni($value, $data);
                }
            }
            else
            {
                foreach ($option as $key => $value)
                {
                    self::setIni($key, $value);
                }
            }
            return;
        }

        if (!is_array($data))
        {
            if (strpos($option, '/') === false)
            {
                self::$config[$option] = $data;
                return;
            }

            $parts = explode('/', $option);
            $max = count($parts) - 1;
            $pos =& self::$config;
            for ($i = 0; $i <= $max; $i ++)
            {
                $part = $parts[$i];
                if ($i < $max)
                {
                    if (!isset($pos[$part]))
                    {
                        $pos[$part] = array();
                    }
                    $pos =& $pos[$part];
                }
                else
                {
                    $pos[$part] = $data;
                }
            }
        }
        else
        {
            foreach ($data as $key => $value)
            {
                self::setIni($option . '/' . $key, $value);
            }
        }
    }

    /**
     * 删除配置
     */
    static function unsetIni($option)
    {
        if (strpos($option, '/') === false)
        {
            unset(self::$config[$option]);
        }
        else
        {
            $parts = explode('/', $option);
            $max = count($parts) - 1;
            $pos =& self::$config;
            for ($i = 0; $i <= $max; $i ++)
            {
                $part = $parts[$i];
                if ($i < $max)
                {
                    if (!isset($pos[$part]))
                    {
                        $pos[$part] = array();
                    }
                    $pos =& $pos[$part];
                }
                else
                {
                    unset($pos[$part]);
                }
            }
        }
    }

    /**
     * 取得配置信息
     */
    static function getIni($option = null)
    {
        if (isset($option))
        {
            $parts = explode('/', $option);
            $max = count($parts) - 1;
            $pos =& self::$config;
            for ($i = 0; $i <= $max; $i ++)
            {
                $part = $parts[$i];
                if ($i < $max)
                {
                    if (!isset($pos[$part]))
                    {
                        $pos[$part] = array();
                    }
                    $pos =& $pos[$part];
                }
                else
                {
                    return $pos[$part];
                }
            }
        }
        else
        {
            return self::$config;
        }
    }

    /**
     * 递归的建立一个目录
     */
    static function mkdir($dir)
    {
        if (is_dir($dir))
        {
            return ;
        }
        if (!is_dir(dirname($dir)))
        {
            self::mkdir(dirname($dir));
        }
        return mkdir($dir);
    }
}

/**
 * 设置对象的自动载入
 */
spl_autoload_register(array('rf', 'autoload'));

function dump($rowset)
{
	return rf::dump($rowset);
}
